package com.ludaxu.google.adapter;

import java.util.List;

import com.ludaxu.google.domain.AppInfo;
import com.ludaxu.google.holder.BaseHolder;
import com.ludaxu.google.holder.MoreHolder;
import com.ludaxu.google.manager.ThreadManager;
import com.ludaxu.google.tools.UiUtils;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public abstract class DefaultAdapter<Data> extends BaseAdapter {
	protected List<Data> datas;
	private static final int DEFAULT_ITEM = 0;
	private static final int MORE_ITEM = 1;

	public List<Data> getDatas() {
		return datas;
	}

	public void setDatas(List<Data> datas) {
		this.datas = datas;
	}

	public DefaultAdapter(List<Data> datas) {
		this.datas = datas;
	}

	@Override
	public int getCount() {
		return datas.size() + 1;// 最后的一个条目,加载更多的条目
	}

	@Override
	public Object getItem(int position) {
		return datas.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	/** 根据位置 判断当前条目时什么类型 */
	@Override
	public int getItemViewType(int position) {
		if (position == datas.size()) {// 当前是最后条目
			return MORE_ITEM;
		}
		return getInnerItemViewType(position);
	}

	private int getInnerItemViewType(int position) {// 如果不是最后条目
		return DEFAULT_ITEM;
	}

	/** 当前ListView 有几种不同的条目类型 */
	@Override
	public int getViewTypeCount() {
		// 默认只有1中条目类型
		return super.getViewTypeCount() + 1;// 有2种不同类型
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {

		BaseHolder holder = null;
		// if (position == datas.size()) {// 如果位置为最后一个位置 就显示最后一个view
		// holder = getMoreHolder();
		// return holder.getContentView();
		// }

		if (convertView == null) {
			if (getItemViewType(position) == DEFAULT_ITEM) {
				holder = getHolder();// 普通条目的holder
			} else if (getItemViewType(position) == MORE_ITEM) {
				holder = getMoreHolder();
			}

		} else {
			if (getItemViewType(position) == DEFAULT_ITEM) {
				holder = (BaseHolder) convertView.getTag();// 复用
			} else {
				holder = getMoreHolder();
			}

		}
		if (getItemViewType(position) == DEFAULT_ITEM) {
			Data info = datas.get(position);
			holder.setInfo(info);
		}

		return holder.getContentView();
	}

	private MoreHolder holder;

	private BaseHolder getMoreHolder() {
		if (holder != null) {
			return holder;
		} else {
			holder = new MoreHolder(this);
		}
		return holder;
	}

	protected abstract BaseHolder<Data> getHolder();

	public void loadMore() {
		ThreadManager.getInstance().createLongPool().execute(new Runnable() {

			@Override
			public void run() {
				// 在子线程中加载更多
				List<Data> newData = onLoad();
				if (newData == null) {
					// TODO 链接服务器失败
					holder.setInfo(MoreHolder.LOAD_ERROR);

				} else if (newData.size() == 0) {
					// TODO 服务器没有数据了
					holder.setInfo(MoreHolder.HAS_NO_MORE);
				} else {
					// 连接成功
					holder.setInfo(MoreHolder.HAS_MORE);
					datas.addAll(newData);// 给listview集合添加新的数据集合

					UiUtils.runOnUiThread(new Runnable() {

						@Override
						public void run() {
							notifyDataSetChanged();// 刷新界面

						}
					});
				}
			}
		});
	}

	/**
	 * 加载更多数据
	 */
	protected abstract List<Data> onLoad();

}
